package com.artevivo.services;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.primefaces.model.SortOrder;
import org.springframework.stereotype.Service;

import com.artevivo.dao.ClienteDAO;
import com.artevivo.dao.CuentaBancariaDAO;
import com.artevivo.entidades.Cliente;
import com.artevivo.entidades.CuentaBancaria;
import com.artevivo.entidades.Matricula;
import com.artevivo.utilidades.Utilidades;

@Service
public class ClienteService {

    @Resource
    private ClienteDAO clienteDAO;

    @Resource
    CuentaBancariaDAO cuentaBancariaDAO;

    // Guarda un cliente segun sus datos
    public Cliente guardarCliente(String nombre, String apellidos, String fechaNacimiento, String direccion, String poblacion, String telefono,
            String movil, String dni, String email, String iban, String entidad, String sucursal, String dc, String numero) throws Exception {

        Cliente res = null;
        Boolean encontrado = false;
        // Comprobamos que el dni del cliente no existe en la BD
        Cliente coincDNI = buscarClientePorDNI(dni);

        if (coincDNI == null) {

            // Si no existe buscamos un cliente con el mismo nombre y apellidos
            List<Cliente> coincApellNom = buscarClientePorApellidosNombre(apellidos, nombre);

            if (coincApellNom != null && !coincApellNom.isEmpty()) {
                // Si encontramos algun cliente con el mismo nombre y apellido,
                // buscamos uno con igual fecha de nacimiento

                for (Cliente c : coincApellNom) {
                    if (c.getFechaNacimiento().equals(fechaNacimiento)) {
                        encontrado = true;
                    }
                    encontrado = encontrado | false;
                }
            }
        } else {
            encontrado = true;
        }
        // Si no encontramos coincidencias creamos el cliente
        if (!encontrado) {

            Cliente cliente = new Cliente();
            cliente.setNombre(Utilidades.convertirPrimeraMayusculaRestoMinusculas(nombre));
            cliente.setApellidos(Utilidades.convertirPrimeraMayusculaRestoMinusculas(apellidos));
            cliente.setFechaNacimiento(Utilidades.formatearFecha(fechaNacimiento));
            cliente.setDireccion(direccion);
            cliente.setPoblacion(poblacion);
            if (telefono != null & !telefono.equals("")) {
                cliente.setTelefono(new Long(telefono));
            }
            if (movil != null & !movil.equals("")) {
                cliente.setMovil(new Long(movil));
            }
            if (dni == null | dni.equals("")) {
                dni = "SIN DNI";
            }
            cliente.setDni(Utilidades.formatearDni(dni));
            cliente.setEmail(email);

            // Comprobamos si han introducido datos bancarios
            Boolean entidadNulo = (entidad.equals("") || entidad == null);
            Boolean sucursalNulo = (sucursal.equals("") || sucursal == null);
            Boolean dcNulo = (dc.equals("") || dc == null);
            Boolean numeroNulo = (numero.equals("") || numero == null);
            // Si los han introducido buscamos si existen ya en la BD,
            // en caso que no existan creamos la cuenta bancaria nueva
            if (!(entidadNulo && sucursalNulo && dcNulo && numeroNulo)) {

                CuentaBancaria cuenta = cuentaBancariaDAO.findCuentaBancaria(iban, entidad, sucursal, dc, numero);
                if (cuenta != null) {
                    cliente.setCuentaBancaria(cuenta);
                } else {
                    CuentaBancaria cb = new CuentaBancaria(iban, entidad, sucursal, dc, numero);
                    cuentaBancariaDAO.insert(cb);
                    cliente.setCuentaBancaria(cuenta);
                }
            }
            clienteDAO.insert(cliente);
            res = cliente;
        }
        return res;

    }

    // Obtener todos los clientes de la BD
    public List<Cliente> obtenerTodosClientes() throws Exception {
        return clienteDAO.findAll();
    }

    // Obtener todos los clientes con el nombre y apellidos pasados
    public List<Cliente> buscarClientePorApellidosNombre(String apellidos, String nombre) {
        return clienteDAO.findClienteByApellidosNombre(apellidos, nombre);
    }

    // Obtener el cliente con el DNI pasado
    public Cliente buscarClientePorDNI(String dni) {
        return clienteDAO.findClienteByDNI(dni);
    }

    // Metodo para obtener los valores que se muestran en la tabla paginada y
    // filtrada
    public List<Matricula> carga(int index, int count, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
        return clienteDAO.lazyLoad(index, count, sortField, sortOrder, filters);
    }

    // Numero de clientes
    public Long clienteCount() {
        return clienteDAO.getClienteCount();
    }

}
